AWS CLI で IAM Policy Simulator を利用して AWS アカウント内の IAM ロールが特定のアクションをできるか確認してみた

AWS CLI で IAM Policy Simulator を利用して AWS アカウント内の IAM ロールが特定のアクションをできるか確認してみた

Clock Icon2024.09.05

IAM Policy Simulator を利用して、IAM ロールが特定のアクションをできるか確認してみました。

IAM ロールに指定アクションの許可があるか確認するコマンド

次のコマンドで、AWS アカウント内の AWSServiceRoleFor から始まる IAM ロール以外のロールに対して、actionName で指定したアクションを実行できるか確認できます。actionName を変更することで、他のアクションも確認できます。下記の例では IAM ロールの作成とロールへのポリシーのアタッチ、インラインポリシーの追加アクションを指定しています。

actionName="iam:CreateRole iam:AttachRolePolicy iam:PutRolePolicy"
aws iam list-roles --query='Roles[?!(starts_with(RoleName,`AWSServiceRoleFor`))].[Arn]' --output text \
| while read roleArn; do
  echo "${roleArn}"
  aws iam simulate-principal-policy \
    --policy-source-arn ${roleArn} \
    --action-names ${actionName} \
    --query EvaluationResults[].[EvalActionName,EvalDecision] \
    --output text
done

実行結果例です。allowed は許可、implicitDeny は暗黙的な拒否を示します。

arn:aws:iam::111122223333:role/test-admin-role-for-idc
iam:CreateRole  allowed
iam:AttachRolePolicy    allowed
iam:PutRolePolicy       allowed
arn:aws:iam::111122223333:role/test-developer-basic-role
iam:CreateRole  implicitDeny
iam:AttachRolePolicy    implicitDeny
iam:PutRolePolicy       implicitDeny

output を table 指定にすることで次の出力例となります。

arn:aws:iam::1111222233339:role/test-admin-role-for-idc
-------------------------------------
|      SimulatePrincipalPolicy      |
+-----------------------+-----------+
|  iam:CreateRole       |  allowed  |
|  iam:AttachRolePolicy |  allowed  |
|  iam:PutRolePolicy    |  allowed  |
+-----------------------+-----------+
arn:aws:iam::111122223333:role/test-developer-basic-role
------------------------------------------
|         SimulatePrincipalPolicy        |
+-----------------------+----------------+
|  iam:CreateRole       |  implicitDeny  |
|  iam:AttachRolePolicy |  implicitDeny  |
|  iam:PutRolePolicy    |  implicitDeny  |
+-----------------------+----------------+

なお、上記コマンドで確認しているアクションは次の権限です。

アクション名 概要
CreateRole IAM ロールを作成
AttachRolePolicy IAM ロールに IAM ポリシーをアタッチ
PutRolePolicy IAM ロールにインラインポリシーを追加、更新

コマンドの解説

IAM Policy Simulator を実行するコマンドとして、simulate-principal-policy を利用しています。

policy-source-arn で指定した IAM エンティティに対して、action-names で指定したアクションの許可があるかを確認できます。

一つの IAM ロールを指定して実行するコマンドです。

aws iam simulate-principal-policy \
  --policy-source-arn arn:aws:iam::111122223333:role/test-admin-role-for-idc \
  --action-names iam:AttachRolePolicy

出力結果例です。冒頭のコマンドでは EvalDecision だけを query オプションで抽出して表示させています。

{
    "EvaluationResults": [
        {
            "EvalActionName": "iam:AttachRolePolicy",
            "EvalResourceName": "*",
            "EvalDecision": "allowed",
            "MatchedStatements": [
                {
                    "SourcePolicyId": "AdministratorAccess",
                    "SourcePolicyType": "IAM Policy",
                    "StartPosition": {
                        "Line": 3,
                        "Column": 17
                    },
                    "EndPosition": {
                        "Line": 8,
                        "Column": 6
                    }
                }
            ],
            "MissingContextValues": [],
            "OrganizationsDecisionDetail": {
                "AllowedByOrganizations": true
            }
        }
    ]
}

上記コマンドを AWS アカウント内の複数の IAM ロールに対して、while 文で実行しています。

AWS アカウント内の AWSServiceRoleFor から始まる IAM ロールを除外した一覧を次のコマンドで取得しています。

aws iam list-roles --query='Roles[?!(starts_with(RoleName,`AWSServiceRoleFor`))].[Arn]' --output text

出力結果例です。

arn:aws:iam::111122223333:role/test-admin-role-for-idc
arn:aws:iam::111122223333:role/test-developer-basic-role

AWSServiceRoleFor から始まる IAM ロールを除外する query の条件は下記ブログを参考にしました。

https://dev.classmethod.jp/articles/inventory-iam-resources/

以上で実行コマンドの解説は終わりです。

さいごに

特定のアクションを実行できるロールを確認したく、調べているうちに、IAM Policy Simulator AWS CLI で利用できることを知ったため、早速試してみました。

他にも S3 の GetObject ができる IAM ロールやユーザーの洗い出しといった用途にも活用できそうです。

以上、このブログがどなたかのご参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.